import 'dart:async';
import 'package:app_core/app_core.dart';
import 'package:app_core/src/utils/system_setting.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';

/// 应用程序启动管理器
/// 1. 应用启动流程管理
/// 2. 错误处理配置
/// 3. 应用初始化
class AppRunManager {
  /// 应用程序启动前的准备工作
  static Future<void> prepareRunApp(CoreConfig config) async {
    try {
      /// 1. 配置错误处理
      _configErrorHandle();

      /// 2. 初始化应用配置
      await _initAppConfig(config);

      /// 3. 启动应用
      runApp(MyApp());
    } catch (e, stack) {
      _handleStartupError('启动失败', e, stack);
      rethrow;
    }
  }

  /// ==================== 初始化相关 ====================
  /// 初始化应用配置
  static Future<void> _initAppConfig(CoreConfig config) async {
    /// 设置全局配置
    appGlobalConfig = config;

    /// 初始化系统服务
    await SystemSetting.init();

    /// 配置对话框
    _configSmartDialog();

    /// 配置 GetX
    _configGetX();
  }

  /// 配置 SmartDialog
  static void _configSmartDialog() {
    SmartDialog.config.custom = SmartConfigCustom(
      ///动画类型
      animationType: SmartAnimationType.centerFade_otherSlide,
      // maskColor: appConfig.dialogConfig.dialogMaskColor,
      /// 含义：阻止返回键关闭对话框
      /// 效果：用户按返回键时，对话框不会关闭
      backType: SmartBackType.block,
    );

    SmartDialog.config.attach = SmartConfigAttach(
      animationType: SmartAnimationType.centerFade_otherSlide,
      // maskColor: appConfig.dialogConfig.dialogMaskColor,
      backType: SmartBackType.block,
    );
  }

  /// 配置 GetX
  static void _configGetX() {
    Get.config(
      logWriterCallback: (text, {bool? isError}) {
        /// 只在调试模式下输出 GetX 日志
        if (kDebugMode) {
          debugPrint(text);
        }
      },
    );
  }

  /// ==================== 错误处理相关 ====================
  /// 配置错误处理
  static void _configErrorHandle() {
    _configFlutterError();
    _configPlatformError();
    _configDebugErrorWidget();
  }

  /// 配置 Flutter 框架错误处理
  static void _configFlutterError() {
    FlutterError.onError = (FlutterErrorDetails details) {
      if (kDebugMode) {
        // 开发模式：显示完整错误信息
        FlutterError.dumpErrorToConsole(details);
      } else {
        // 生产模式：记录错误
        _handleError('Flutter Error', details.exception, details.stack);
      }
    };
  }

  /// 配置平台错误处理
  static void _configPlatformError() {
    PlatformDispatcher.instance.onError = (error, stack) {
      _handleError('Platform Error', error, stack);
      return true;
    };
  }

  /// 配置调试环境错误页面
  // static void _configDebugErrorWidget() {
  // if (kDebugMode) {
  //   ErrorWidget.builder = (FlutterErrorDetails details) {
  //     return _buildDebugErrorWidget(details);
  //   };
  // }
  /// 配置调试环境错误页面
  static void _configDebugErrorWidget() {
    if (kDebugMode) {
      ErrorWidget.builder = (FlutterErrorDetails details) {
        // 1. 在控制台打印详细错误信息
        debugPrint('�� ========== 错误页面被触发 ==========');
        debugPrint('❌ 错误类型: ${details.exception.runtimeType}');
        debugPrint('❌ 错误信息: ${details.exception}');
        debugPrint('📚 错误堆栈:');
        debugPrint('📍 错误位置: ${details.library}');
        debugPrint('🔧 错误上下文: ${details.context}');
        debugPrint('=====================================');

        // 2. 返回一个非阻塞的错误提示
        return Material(
          color: Colors.transparent,
          child: Container(),
          // child: Container(
          //   margin: const EdgeInsets.all(16),
          //   padding: const EdgeInsets.all(12),
          //   decoration: BoxDecoration(
          //     color: Colors.red[100]?.withOpacity(0.9),
          //     borderRadius: BorderRadius.circular(8),
          //     border: Border.all(color: Colors.red[300]!),
          //     boxShadow: [BoxShadow(color: Colors.red.withOpacity(0.3), blurRadius: 8, offset: const Offset(0, 2))],
          //   ),
          //   child: Row(
          //     children: [
          //       const Icon(Icons.error_outline, color: Colors.red, size: 20),
          //       const SizedBox(width: 8),
          //       Expanded(child: Text('应用遇到错误，请查看控制台日志', style: TextStyle(color: Colors.red[800], fontSize: 14, fontWeight: FontWeight.w500))),
          //       IconButton(
          //         icon: const Icon(Icons.close, color: Colors.red, size: 20),
          //         onPressed: () {
          //           // 可以添加关闭逻辑，但通常不需要
          //         },
          //         padding: EdgeInsets.zero,
          //         constraints: const BoxConstraints(minWidth: 24, minHeight: 24),
          //       ),
          //     ],
          //   ),
          // ),
        );
      };
    }
  }

  /// 处理启动错误
  static void _handleStartupError(String type, Object error, StackTrace? stack) {
    debugPrint('🚨 [$type] Error: $error');
    if (stack != null) {
      debugPrint('📚 Stack trace:\n$stack');
    }

    // TODO: 可以在这里添加启动错误上报
    // await ErrorReporter.reportStartupError(error, stack);
  }

  /// 处理运行时错误
  static void _handleError(String type, Object error, StackTrace? stack) {
    if (kDebugMode) {
      YHLog.e('运行时错误类型[$type],错误Error: $error');
      if (stack != null) {
        YHLog.e(' 运行时错误栈Stack trace:\n$stack');
      }
    } else {
      _handleProdError(type, error, stack);
    }
  }

  /// 处理生产环境错误
  static void _handleProdError(String type, Object error, StackTrace? stack) {
    // TODO: 在生产环境中集成错误上报服务
    // await ErrorReporter.report(type, error, stack);
    print('🚨 错误类型: $type,🚨 错误: $error,📚 错误堆栈: $stack');
    // 错误分类处理
    switch (type) {
      case 'Platform Error':
        break;
      case 'Flutter Error':
        break;
      default:
        // 处理其他错误
        break;
    }
  }

  /// 构建开发环境错误页面
  static Widget _buildDebugErrorWidget(FlutterErrorDetails details) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.red,
        title: const Text('调试模式 - 错误信息🙅'),
        leading: IconButton(icon: const Icon(Icons.arrow_back), onPressed: () => Navigator.of(Get.context!).pop()),
      ),
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Icon(Icons.error_outline, color: Colors.red, size: 64),
              const SizedBox(height: 16),
              const Text('应用程序遇到问题', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
              const SizedBox(height: 16),
              Expanded(child: SingleChildScrollView(child: Text(details.toString(), style: const TextStyle(fontSize: 14)))),
            ],
          ),
        ),
      ),
    );
  }
}
